package iface.aplicativo.apresentacao.controle;

import iface.aplicativo.excecao.MensagemException;
import iface.aplicativo.negocio.aps.ManterVeiculosAPS;
import iface.aplicativo.negocio.entidade.Acessorio;
import iface.aplicativo.negocio.entidade.Cambio;
import iface.aplicativo.negocio.entidade.Combustivel;
import iface.aplicativo.negocio.entidade.Fabricante;
import iface.aplicativo.negocio.entidade.Modelo;
import iface.aplicativo.negocio.entidade.Veiculo;
import iface.aplicativo.util.BeanAbstrato;
import iface.arquitetura.utilitario.ListaTO;

import java.io.Serializable;
import java.util.Collection;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@ManagedBean
@SessionScoped
public class ManterVeiculosBean extends BeanAbstrato implements Serializable {

	private static final long serialVersionUID = 4285899560377776076L;

	private Veiculo veiculo;
	private Veiculo veiculoAux;
	private boolean telaLancamento;
	private boolean telaCadastroEntrada;
	private boolean telaVenderVeiculos;

	@ManagedProperty(value = "#{manterVeiculosAPS}")
	private ManterVeiculosAPS service;

	public void setService(ManterVeiculosAPS service) {
		this.service = service;
	}

	public Collection<Veiculo> getTodosVeiculos() throws Exception {
		return this.service.getTodosVeiculos();
	}

	public Collection<ListaTO> getTodosFabricantes() throws Exception {
		return this.service.consultarTodosFabricantes();
	}

	public Collection<ListaTO> getTodosCombustiveis() throws Exception {
		return this.service.consultarTodosCombustiveis();
	}

	public Collection<ListaTO> getTodosCambios() throws Exception {
		return this.service.consultarTodosCambios();
	}

	public Collection<ListaTO> getTodasUfs() throws Exception {
		return this.service.consultarTodasUfs();
	}

	public Collection<ListaTO> getModelosPorFabricante() {
		return this.service.consultarModelosPorFabricante(this.getVeiculo()
				.getFabricante());
	}

	public Collection<Acessorio> getTodosAcessorios() throws Exception {
		return this.service.consultarTodosAcessorios();
	}

	public void salvarVeiculo() throws Exception {

		try {
			String msg = this.service.salvarVeiculo(this.getVeiculo());
			this.limparCampos();

			this.setMensagem(msg, MSG_TIPO_INFORMACAO, "");
		} catch (final MensagemException e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_AVISO, "");
		} catch (final Exception e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_ERRO, "");
		}
	}

	public void incluirVeiculoModal() throws Exception {

		try {
			String msg = this.service.salvarVeiculo(this.getVeiculo());
			this.veiculo = this.service.consultarVeiculoPorPlaca(this
					.getVeiculo().getNrPlaca());

			HttpServletRequest req = (HttpServletRequest) FacesContext
					.getCurrentInstance().getExternalContext().getRequest();

			HttpSession session = req.getSession();

			if (this.isTelaCadastroEntrada()) {
				CadastrarEntradaBean cadastroEntradaBean = (CadastrarEntradaBean) session
						.getAttribute("cadastrarEntradaBean");
				cadastroEntradaBean.getEntradaVeiculo().setVeiculo(
						this.getVeiculo());
			} else if (this.isTelaLancamento()) {
				ManterLancamentosBean manterLancamentosBean = (ManterLancamentosBean) session
						.getAttribute("manterLancamentosBean");
				manterLancamentosBean.getLancamento().setVeiculo(
						this.getVeiculo());
			} else if (this.isTelaVenderVeiculos()) {
				VenderVeiculosBean venderVeiculosBean = (VenderVeiculosBean) session
						.getAttribute("venderVeiculosBean");
				venderVeiculosBean.getVendaVeiculo().setVeiculo(
						this.getVeiculo());
			}

			this.limparCampos();

			this.setMensagem(msg, MSG_TIPO_INFORMACAO, "");
		} catch (final MensagemException e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_AVISO, "");
		} catch (final Exception e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_ERRO, "");
		}
	}

	public void excluirVeiculo() throws Exception {

		try {
			String msg = this.service.excluirVeiculo(this.getVeiculoAux());

			this.limparCampos();

			this.setMensagem(msg, MSG_TIPO_INFORMACAO, "");
		} catch (final MensagemException e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_AVISO, "");
		} catch (final Exception e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_ERRO, "");
		}
	}

	public void limparCampos() {
		this.setVeiculo(null);
		this.setVeiculoAux(null);
		this.setTelaCadastroEntrada(false);
		this.setTelaLancamento(false);
	}

	public Veiculo getVeiculo() {
		if (veiculo == null) {
			veiculo = new Veiculo();
			veiculo.setFabricante(new Fabricante());
			veiculo.setModelo(new Modelo());
			veiculo.setCombustivel(new Combustivel());
			veiculo.setCambio(new Cambio());
		}
		return veiculo;
	}

	public void setVeiculo(Veiculo veiculo) {
		if (veiculo != null) {
			if (veiculo.getCombustivel() == null) {
				veiculo.setCombustivel(new Combustivel());
			}
			if (veiculo.getCambio() == null) {
				veiculo.setCambio(new Cambio());
			}
		}
		this.veiculo = veiculo;
	}

	public Veiculo getVeiculoAux() {
		if (veiculoAux == null) {
			veiculoAux = new Veiculo();
		}
		return veiculoAux;
	}

	public void setVeiculoAux(Veiculo veiculoAux) {
		this.veiculoAux = veiculoAux;
	}

	public boolean isTelaLancamento() {
		return telaLancamento;
	}

	public void setTelaLancamento(boolean telaLancamento) {
		this.telaLancamento = telaLancamento;
	}

	public boolean isTelaCadastroEntrada() {
		return telaCadastroEntrada;
	}

	public void setTelaCadastroEntrada(boolean telaCadastroEntrada) {
		this.telaCadastroEntrada = telaCadastroEntrada;
	}

	public boolean isTelaVenderVeiculos() {
		return telaVenderVeiculos;
	}

	public void setTelaVenderVeiculos(boolean telaVenderVeiculos) {
		this.telaVenderVeiculos = telaVenderVeiculos;
	}

}
